package com.cennavi.minemapexdemo.activity.exlayer;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.minedata.minemap.MinemapAccountManager;
import com.minedata.minemap.camera.CameraPosition;
import com.minedata.minemap.geometry.LatLng;
import com.minedata.minemap.map.MapView;
import com.minedata.minemap.map.MineMap;
import com.minedata.minemap.overlay.MultiPointLayer;
import com.minedata.minemap.overlay.MultiPointOptions;
import com.cennavi.minemapexdemo.R;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MultiPointActivity extends AppCompatActivity {
    private MapView mapView;
    private static MineMap mineMap;
    private MultiPointLayer multiPointLayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MinemapAccountManager.getInstance(getApplicationContext(),
                "25cc55a69ea7422182d00d6b7c0ffa93",
                null,
                "2374");

        setContentView(R.layout.activity_main_layer);
        mapView = findViewById(R.id.mapView);
        mapView.addMapRenderCallback(new MapView.OnMapReadyListener() {
            @Override
            public void onMapReady(final MineMap mineMap) {
                MultiPointActivity.mineMap = mineMap;
                mineMap.setStyleUrl("http://minedata.cn/service/solu/style/id/2374", new MineMap.OnStyleLoadedListener() {

                    @Override
                    public void onStyleLoaded(String s) {
                        addMultiPointGraphics();
                    }
                });
                mineMap.setRepaint(false);
                //不显示指南针
                mineMap.getUiSettings().setCompassEnabled(false);
                //不可以旋转地图
                mineMap.getUiSettings().setRotateGesturesEnabled(false);
                mineMap.setCameraPosition(
                        new CameraPosition.Builder()
                                .target(new LatLng(34.2419937, 108.9418989))//设置相机指向的位置
                                .zoom(3)//设置相机缩放等级
                                .tilt(0)//设置相机的俯视角度
                                .bearing(0) //摄像机指向的方向,从北部顺时针方向设置
                                .build());
                //设置是否显示地图调试信息，默认是不显示
                mineMap.setDebugActive(false);
            }
        });
    }

    //添加大规模散点
    public void addMultiPointGraphics() {
        MultiPointOptions options = new MultiPointOptions("multipointlayer");
        options.setMaxZoom(15);
        options.setMinZoom(3);
        options.addAll(getMultiPointData(loadJsonFromAsset("exp_city_data.json", MultiPointActivity.this)));
        multiPointLayer = mineMap.addLayer(options);
    }

    @Override
    protected void onStart() {
        if (mapView != null) {
            mapView.onStart();
        }
        super.onStart();
    }

    @Override
    protected void onResume() {
        if (mapView != null)
            mapView.onResume();
        super.onResume();
    }

    @Override
    protected void onPause() {
        if (mapView != null)
            mapView.onPause();
        super.onPause();
    }

    @Override
    protected void onStop() {
        if (mapView != null)
            mapView.onStop();
        super.onStop();
    }

    @Override
    public void onDestroy() {
        if (mapView != null)
            mapView.onDestroy();
        super.onDestroy();
    }

    //获取散点数据
    public List<MultiPointOptions.MultiPointItem> getMultiPointData(String data) {
        if (data.isEmpty()) {
            return null;
        }

        List<MultiPointOptions.MultiPointItem> items = new ArrayList<>();

        try {
            JSONArray array = new JSONArray(data);
            for (int i = 0; i < array.length(); i++) {
                JSONObject json = new JSONObject(array.get(i).toString());
                String latitude = json.get("latitude").toString();
                String longitude = json.get("longitude").toString();
                LatLng latLng;

                for (int j = 0; j < 4; j++) {
                    if (j == 0) {
                        latLng = new LatLng(Double.valueOf(latitude), Double.valueOf(longitude));
                    } else if (j == 1) {
                        latLng = new LatLng(Double.valueOf(latitude) - 0.5, Double.valueOf(longitude) - 0.5);
                    } else if (j == 2) {
                        latLng = new LatLng(Double.valueOf(latitude) + 1.3, Double.valueOf(longitude) - 1);
                    } else {
                        latLng = new LatLng(Double.valueOf(latitude) - 0.2, Double.valueOf(longitude) + 0.3);
                    }

                    MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                    item.setPosition(latLng);
                    item.setRadius(2f);
                    item.setFillColor(Color.parseColor("#00F8FF"));
                    items.add(item);
                }
            }

            for (int i = 0; i < 3; i++) {
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                if (i == 0) {
                    item.setPosition(new LatLng(43.8327, 87.6233));
                } else if (i == 1) {
                    item.setPosition(new LatLng(46.8427, 88.6153));
                } else {
                    item.setPosition(new LatLng(44.7250, 88.6634));
                }

                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 1000; i++) {
                double latitude = Math.random() * 13 + 25;
                double longitude = Math.random() * 17 + 101;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 1000; i++) {
                double latitude = Math.random() * 13 + 28;
                double longitude = Math.random() * 17 + 100;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 500; i++) {
                double latitude = Math.random() * 13 + 29;
                double longitude = Math.random() * 10 + 105;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 500; i++) {
                double latitude = Math.random() * 5 + 23;
                double longitude = Math.random() * 10 + 105;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 200; i++) {
                double latitude = Math.random() * 5 + 40;
                double longitude = Math.random() * 7 + 113;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 200; i++) {
                double latitude = Math.random() * 10 + 42;
                double longitude = Math.random() * 5 + 122;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 100; i++) {
                double latitude = Math.random() * 5 + 41;
                double longitude = Math.random() * 5 + 117;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 500; i++) {
                double latitude = Math.random() * 13 + 29;
                double longitude = Math.random() * 19 + 82;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 500; i++) {
                double latitude = Math.random() * 7 + 42;
                double longitude = Math.random() * 7 + 123;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 50; i++) {
                double latitude = Math.random() * 3 + 37;
                double longitude = Math.random() * 9 + 75;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 50; i++) {
                double latitude = Math.random() * 2 + 46;
                double longitude = Math.random() * 2 + 120;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 50; i++) {
                double latitude = Math.random() * 3 + 45;
                double longitude = Math.random() * 3 + 130;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 200; i++) {
                double latitude = Math.random() * 4 + 26;
                double longitude = Math.random() * 5 + 115;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 50; i++) {
                double latitude = Math.random() * 2 + 24;
                double longitude = Math.random() * 3 + 114;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 100; i++) {
                double latitude = Math.random() * 3 + 21;
                double longitude = Math.random() * 5 + 107;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 300; i++) {
                double latitude = Math.random() * 4 + 30;
                double longitude = Math.random() * 6 + 115;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 200; i++) {
                double latitude = Math.random() * 6 + 33;
                double longitude = Math.random() * 3 + 116;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 100; i++) {
                double latitude = Math.random() * 2 + 40;
                double longitude = Math.random() * 3 + 122;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 50; i++) {
                double latitude = Math.random() * 1 + 36;
                double longitude = Math.random() * 1 + 119;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 20; i++) {
                double latitude = Math.random() * 0.5 + 37;
                double longitude = Math.random() * 1 + 120;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 100; i++) {
                double latitude = Math.random() * 4 + 27;
                double longitude = Math.random() * 2 + 119;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 100; i++) {
                double latitude = Math.random() * 3 + 23;
                double longitude = Math.random() * 8 + 98;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 100; i++) {
                double latitude = Math.random() * 3 + 41;
                double longitude = Math.random() * 14 + 81;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 50; i++) {
                double latitude = Math.random() * 2 + 44;
                double longitude = Math.random() * 7 + 83;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            for (int i = 0; i < 50; i++) {
                double latitude = Math.random() * 6 + 31;
                double longitude = Math.random() * 4 + 79;
                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();

                item.setPosition(new LatLng(latitude, longitude));
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }

            try {
                InputStream instream = MultiPointActivity.this.getAssets().open("multimarker_city_data.csv");
                if (instream != null) {
                    InputStreamReader inputreader = new InputStreamReader(instream);
                    BufferedReader buffreader = new BufferedReader(inputreader);
                    String line;
                    int count = 0;

                    while ((line = buffreader.readLine()) != null) {
                        if (count > 43500) {
                            break;
                        }

                        String everyLine = line;
                        String[] strarray1 = everyLine.split(",");
                        String[] strarray2 = strarray1[1].split(";");


                        if (strarray2[0].equals("null") || strarray2[1].equals("null")) {
                            continue;
                        }

                        double longitude = Double.valueOf(strarray2[0]);
                        double latitude = Double.valueOf(strarray2[1]);

                        if (longitude < latitude) {
                            continue;
                        }

                        MultiPointOptions.MultiPointItem item1 = new MultiPointOptions.MultiPointItem();

                        item1.setPosition(new LatLng(latitude, longitude));
                        item1.setRadius(2f);
                        item1.setFillColor(Color.parseColor("#00F8FF"));
                        items.add(item1);

                        count++;
                    }
                    instream.close();
                    buffreader.close();
                }
            } catch (java.io.FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            for (int i = 0; i < 3; i++) {
                LatLng latLng;

                if (i == 0) {
                    latLng = new LatLng(39.8974, 116.3564);
                } else if (i == 1) {
                    latLng = new LatLng(41.6772, 123.4631);
                } else {
                    latLng = new LatLng(31.2363, 121.4803);
                }

                MultiPointOptions.MultiPointItem item = new MultiPointOptions.MultiPointItem();
                item.setPosition(latLng);
                item.setRadius(2f);
                item.setFillColor(Color.parseColor("#00F8FF"));
                items.add(item);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return items;
    }

    //从Asset文件夹中读取json数据
    private static String loadJsonFromAsset(String filename, Context context) {
        try {
            InputStream is = context.getAssets().open(filename);
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            return new String(buffer, "UTF-8");
        } catch (Exception e) {
        }
        return null;
    }

    public void btnTest(View view) {
        mineMap.snapshot(new MineMap.OnSnapshotReadyCallback() {
            @Override
            public void onSnapshotReady(Bitmap snapshot) {
                //图片存放路径
                String sdCardDir = "/storage/emulated/0/Android/data/com.minedata.minemap/files/";

                try {
                    File dirFile = new File(sdCardDir);
                    if (!dirFile.exists()) {
                        dirFile.mkdirs();
                    }
                    //创建日期
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                    String sdfDate = sdf.format(date);
                    File file = new File(sdCardDir, "snapshot" + "(" + sdfDate + ")" + ".png");
                    FileOutputStream fos = new FileOutputStream(file);
                    snapshot.compress(Bitmap.CompressFormat.PNG, 100, fos);
                    fos.flush();
                    fos.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}
